// 二进制优化版本
// 技巧:通过"打包"的技巧将多重背包问题转化成01背包问题
// 原因是打包后的背包能够组合出所有个数的背包

#include <iostream>
using namespace std;

const int N = 20000;

int n, m;
int v[N], w[N], cnt;
int f[N];

int main()
{
    cin >> n >> m;
    while (n--)
    {
        int vi, wi, s;
        cin >> vi >> wi >> s;
        int k = 1;
        while (s >= k)
        {
            v[cnt] = k * vi;
            w[cnt++] = k * wi;
            s -= k;
            k <<= 1;
        }
        if (s)
        {
            v[cnt] = s * vi;
            w[cnt++] = s * wi;
        }
    }
    // 01背包问题解法
    for (int i = 0; i < cnt; ++i)
        for (int j = m; j >= v[i]; --j)
            f[j] = max(f[j], f[j - v[i]] + w[i]);
    cout << f[m] << endl;

    return 0;
}